查看原文
其他

ORA-12516|数据库连接问题遇到的坑

JiekeXu JiekeXu DBA之路 2024-03-03

作者 | JiekeXu

来源 | JiekeXu DBA之路(ID: JiekeXu_IT)

大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起看看 ORA-12516|数据库连接问题,欢迎点击上方蓝字关注我,标星或置顶,更多干货第一时间到达!


事情是这样的,听我慢慢道来,在一个夜黑风高的周五晚上,出现了……哦,不对,剧本不是这样的哈,回归正题,有两套 Oracle 11g 的单机环境通过搭建 DG switchover  的方式进行迁移,当迁移切换后,数据库状态正常,但应用无法连接,报错 ora-12516 错误,如下图所示:


[66000][12516] Listener refused the connection with the following error: ORA-12516, TNS:listener could not find available handler with matching protocol stackoracle.net.ns.NetException: Listener refused the connection with the following error:ORA-12516, TNS:listener could not find available handler with matching protocol stack.

但是自己通过轻松连接的方式测试发现,只有通过主 service_names 可以连接,其他的 service_names 均不能连接。这里的主 service_names 指的就是创建实例时生成的第一个。如下指的就是“jiekexu”。

 

SQL> show parameter name
NAME TYPE VALUE------------------------------------ ----------- ------------------------------cell_offloadgroup_name stringdb_file_name_convert stringdb_name string jiekexudb_unique_name string jiekexuglobal_names boolean FALSEinstance_name string jiekexulock_name_space stringlog_file_name_convert stringoptimizer_dynamic_sampling integer 2processor_group_name stringservice_names string jiekexu,test,orcl,scott

service_names 有多个服务名

查看监听状态正常,端口为 1523 .但是就是无法通过例如 test,scott 等的服务名连接,报错均为 ORA-12516,重启监听,注册监听等等,被坑了好久好久。



多番检查没有问题,于是寻求网络,强大的百度对于 ' ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程'错误,无一例外的都是让我修改最大连接数,翻了两页的内容均是一样的结果。

SQL> alter system set processes=300 scope=spfile;

无果,还是放弃百度,寻求 MOS 的帮助,但也没有太大的帮助,重启监听,修改监听参数的等等均没有进展,真可谓是山穷水尽疑无路呐。


柳暗花明又一村


20:30、21:30、22:00 时间花花的就过去了,偶然间看到“local_listener”的作用的一篇文章,【pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,要想让pmon动态注册listener,需要设置local_listener参数。

SQL> show parameter listener
NAME TYPE VALUE------------------------------------ ----------- ------------------------------listener_networks stringlocal_listener stringremote_listener string


查看后发现,local_listener  确实为空,没有值,但发现原主库现今的备库中此参数有值不为空。

ALTER SYSTEM SET local_listener='TEST' SCOPE=BOTH;

但奇怪的是 $ORACLE_HOME/network/admin/tnsnames.ora 文件中并没有 local_listener 参数的任何设置,猜测可能什么时候被删除了而没有注意到,故在 tnsnames.ora 此文件中添加

TESTIP = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.0.X.X )(PORT = 1523)) )

然后在数据库中注册  local_listener 然后注册监听

ALTER SYSTEM SET local_listener='TESTIP' SCOPE=BOTH;

ALTER SYSTEM REGISTER;

查看监听,其他的服务名也已经注册上了,当然,有问题之前也是注册上的,这点就比较好奇,不知所以,希望有朋友不吝赐教。但使用轻松连接的方式均可以连接了。由于是事后本文,没有当时的截图,就只能到这里了。非 1521 默认端口,这个坑有点大,稍微不注意就中招了,今天有点时间,先记录一下吧,免得以后再犯同样的问题。

SQL> conn sys/REoracle@10.0.X.X:1523/test as sysdba Connected.SQL> SQL> conn sys/REoracle@10.0.X.X:1523/scott as sysdba Connected.SQL> SQL> conn sys/REoracle@10.0.X.X:1523/orcl as sysdba Connected.

备注:轻松连接方式指的是:sqlplus user/passwd@db_ip:port/server_names

前面在  tnsnames.ora 此文件中添加的 TESTIP 算是别名,代指等号后面的内容,如果不指定别名,当然也可以直接在注册是写明全部内容,就是有点长。RAC 的 local_listener 一般就是一长串地址,并没有指定别名。

ALTER SYSTEM SET local_listener='(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =10.0.X.X )(PORT = 1523)))' SCOPE=BOTH;

那么,今天就到这里结尾了,先记录下来,以后有问题在继续跟进吧。如果此文对您有帮助,欢迎点赞、在看与转发,写作不易,坚持写作更不易,您的点赞、转发,举手之劳,便是对作者最大的支持,也能让更多的人受益,感谢!

———————————————————————————

公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
腾讯云:https://cloud.tencent.com/developer/user/5645107

———————————————————————————



2021年7月国产数据库排行榜:openGauss高歌猛进,GBase持续下跌

Oracle 12c 及以上版本补丁更新说明及下载方法(收藏版)

Oracle 19c 19.10DBRU 最新补丁升级看这一篇就够了

ASM 管理的内部工具:KFED、KFOD、AMDU

性能优化|关于数据库历史性能问题的一道面试题

一线运维 DBA 五年经验常用 SQL 大全(二)

ORA-00349|激活 ADG 备库时遇到的问题

Oracle 轻量级实时监控工具 oratop

MySQL OCP 认证考试你知道吗?

Oracle 19C RAC 安装遇到的坑

国产数据库|TiDB 5.0 快速体验

Oracle 19C MAA 搭建指南

Oracle 每日一题系列合集

百花齐放的国产数据库

继续滑动看下一个

ORA-12516|数据库连接问题遇到的坑

JiekeXu JiekeXu DBA之路
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存